perm filename FIX.FAI[TMP,LCS]3 blob sn#396942 filedate 1978-11-22 generic text, type T, neo UTF8
	TITLE LINK
;	TITLE MIXER
	A←1 ↔ B←2 ↔ C←3	;POINTERS TO INBUF #1,#2, AND OUTBUF
	D←4 ↔ E←5
	DUR←6 ↔ MAX←7	;TOTAL DURATION, MAXIMUM AMP
	R1←10 ↔ R2←11	;RATIO #1, RATIO #2 , DEFAULT = .5
	R3←12
	BC1←13 ↔ BC2←14 ↔ BC3←15 ;SAMPLE COUNTS, 1st,2nd, 3rd = out buf
	P←17 ↔ NBUFS←←14;P=PDL, NUMBER OF BUFFERS (MAYBE SHOULD BE MORE)



BEG:	MOVE P,[PWD:IOWD 40,PDL]	;SETUP PUSH DOWN LIST

MODE:	MOVE [MIXMO:ASCIZ/MIX/]	;SET TO MIX MODE
	MOVEM MODNAM#
;	CLRBFI
;	OUTSTR [ASCIZ/
;	LINK OR MIX (L OR M) : /]
;	INCHRW A
;	CAIE A,"L"
;	CAIN A,"l"
	JRST LINK
;	CAIE A,"M"
;	CAIN A,"m"
;	JRST MIXER
;	JRST MODE

LNKTBL:	BLOCK 2000

LINK:	RESET
	MOVE [LINKMO:ASCIZ/LINK/]	;SET TO LINK MODE
	MOVEM MODNAM
	MOVE R1,[PDWD:	-400,LNKTBL]	;SETUP LINK PDL

LLOOP:
	CLRBFI
	OUTSTR [ASCIZ/
TYPE FILE NAME OR (CR) TO END : /]
	SETZ BC1,
	PUSHJ P,GNAME
	SKIPE NONAME#
	JRST LLOOK

	PUSH R1,FILNAM
	PUSH R1,FILNAM+1
	PUSH R1,FILNAM+2
	PUSH R1,FILNAM+3

	JRST LLOOP
	


LLOOK:	MOVEM R1,TOPDL#		;SAVE END OF FILES LIST
	PUSHJ P,ONAME		;GET OUTPUT FILE NAME
	OUT			;SETUP OBUFS
	CAIA
	JRST 4,.
	HRRZ C,BUF3+1	;GET OUTBUF ADDRESS

	MOVE R1,PDWD		;POINT TO START OF LIST

	PUSHJ P,GFILE		;GET FIRST FILE

	HRRZ A,BUF1+1		;POINT TO INBUF
	MOVE [HDRWD:525252525252]
	CAME (A)		;CHECK FOR HEADER
	JRST NOHDR
	SETOM HDR#		;SET HEADER MODE

	HRRZ B,2(A)
	SOSN B
	HRRZI =18	;1	18
	SOSN B
	HRRZI =9	;2	9
	SOSN B
	HRRZI =36	;3	36
	SKIPE B
	HRRZI =12	;0	12 BITS
	HLL 2(A)	;has # samples per word in LH
	MOVEM NBITS#
	
	HRRZ 3(A)	;nchans = 1 for Mono, 2 for Stereo, 4 for Quad
	HRRZM NCHNLS#

	HRRZI (C)
	HRRZI C,200(C)	;END OF HEADER
	HRLI (A)	;GET INBUF ADDRESS
	BLT (C)		;MOVE INBUF TO OUTBUF

	IN 11,		;GET NEW INBUF
	JRST OUTHDR
	PUSHJ P,CKEND
	SKIPN EOF
	JRST FUNNY

OUTHDR:	SETZM -174(C)	;ZERO MAX AMP

	HRRZ A,NBITS
	MOVE A,(A)[BTBL:1400,,3
			2200,,2
			1100,,4
			4400,,1]
	MOVEM A,NBITS	;NBITS HAS BYTE POINTER

	PUSHJ P,LOUT	;OUTPUT HEADER



	HRRZ A,BUF1+1	;SETUP INBUF BYTE POINTER
	HLL A,NBITS
	HRRZ BC1,NBITS
	HRRZI BC3,(BC1)
	IMUL BC1,BUF1+2	;MULTIPLY WORD COUNT BY NUM OF SAMPLES IN A WORD
	HRRZ C,BUF3+1	;SETUP OUTBUF BYTE POINTER
	HLL C,NBITS
	IMUL BC3,BUF3+2	;BC3 ← NUM OF WORDS IN OUTBUF * NUM OF SAMPLES IN A WORD

LKLOP:	ILDB D,A		;GET SAMPLE FROM IN BUF
	IDPB D,C		;STORE SAMPLE IN OUT BUF
	SOJE BC1,INGET		;CHECK IF IN BUF FULL
CHKOUT:	SOJG BC3,LKLOP		;CHECK IF OUT BUF FULL
	PUSHJ P,LOUT
	JRST LKLOP

INGET:	PUSHJ P,LIN
	JRST CHKOUT



LIN:	SKIPE EOF
	JRST NXTFIL
	IN 11,			;LINK INPUT SUB
	CAIA
	JRST CKEND
FIXUP:	HRRZ BC1,NBITS
	IMUL BC1,BUF1+2		;MULTIPLY WORD COUNT BY NUM OF SAMPLES IN A WORD
	HRRZ A,BUF1+1		;POINT TO 1st INBUF
	HLL A,NBITS		;NUMBER OF BITS IN SAMPLE
	POPJ P,

CKEND:	STATO 11,20000		;CHECK FOR ERROR
	JRST 4,.
	SETOM EOF#
	SKIPN BC1+2
NXTFIL:	PUSHJ P,GFILE
	JRST FIXUP
	


LOUT:	HRRM C,BUF3+1		;POINT TO LAST OUTBUF WORD
	OUT			;LINK OUTPUT SUB
	CAIA
	JRST 4,.
	HRRZ BC3,NBITS
	IMUL BC3,BUF3+2		;BC3 ← NUM OF WORDS IN OUTBUF * NUM OF SAMPLES IN A WORD
	HRRZ C,BUF3+1		;POINT TO OUTBUF
	HLL C,NBITS		;NUMBER OF BITS IN SAMPLE
	POPJ P,



NOHDR:	SETZM HDR
	MOVE HDRWD
	MOVEM (C)

	CLRBFI
	OUTSTR [ASCIZ/
NO HEADER SO

	0 = 6.4K	1 = 12.8K	2 = 25.6K
	3 = 51.2K	4 = 102.4K	5 = 204.8K
	SAMPLING RATE CODE? (DEFAULT IS 1) : /]

	INCHWL A
	PUSHJ P,INNUM
	
	SKIPL
	CAILE 5
	HRRZI 1
	HRRZM SRATE#
	HRLZM 1(C)	;HDR+1 IS [SRATE CODE,,0]

	CLRBFI
	OUTSTR [ASCIZ/
	NUMBER OF BITS PER SAMPLE? (DEFAULT IS 12) : /]

	INCHWL A
	PUSHJ P,INNUM
	SETZ A,

	CAIN =9
	MOVE A,[4,,2]
	CAIN =36
	MOVE A,[1,,3]
	CAIE =16
	CAIN =18
	MOVE A,[2,,1]
	JUMPN A,GOTIT
	HRLZI A,3

GOTIT:	MOVEM A,NBITS
	MOVEM A,2(C)	;HDR+2 HAS [SMPLS PER WD,,BITS PER SMPL CODE]

	CLRBFI
	OUTSTR [ASCIZ/
	NUMBER OF CHANELS? (DEFAULT IS 1) : /]

	INCHWL A
	PUSHJ P,INNUM
	CAIE 2
	CAIN 4		;1=1 2=2 4=4 OR 1 FOR ANYTHING ELSE
	CAIA
	HRRZI 1
	HRRZM NCHNLS
	HRRZM 3(C)	;HDR+3 HAS NUM OF CHANELS

	HRRZI C,200(C)
	JRST OUTHDR



GFILE:				;GET NEXT FILE SUB
	CAMN R1,TOPDL		;CHECK NOW AT END OF LIST
	JRST ALLDON
	ADD R1,[BH4:4,,4]

	POP R1,FILNAM+3
	POP R1,FILNAM+2		;GET FILE NAME
	POP R1,FILNAM+1
	POP R1,FILNAM

	OPEN 11,[14↔'DSK   '↔BUF1]
	JRST 4,.
	INBUF 11,NBUFS		;SETUP INPUT BUFFER RING
	LOOKUP 11,FILNAM
	JRST FNF
	
	IN 11,		;INPUT FIRST BUF
	CAIA
	JRST CKEND
	SETZM EOF
	ADD R1,BH4		;POINT TO NEXT FILE
	SKIPE HDR		;SKIP HEADER

	IN 11,			;INPUT FIRST DATA BUF
	POPJ P,
	JRST CKEND
ALLDON:	
	OUT		;FINISH OUTPUT
	CAIA
	JRST 4,.

	RELEAS			;RELEASE DISK

	OUTSTR [ASCIZ/
	ALL DONE!/]
	EXIT

FNF:	MOVE P,PWD		;FILE NOT FOUND
	PUSH P,LINK			
	OUTSTR [ASCIZ/
	FILE NOT FOUND. START ALL OVER/]
	POPJ P,

FUNNY:	OUTSTR [ASCIZ/
	NO DATA AFTER HEADER?/]
	JRST 4,.


MIXER:	RESET
	CLRBFI
	OUTSTR [ASCIZ/
	TYPE FIRST NAME : /]
	SETZ BC1,		;SET TO 0 FOR DEFAULT FILE NAME
	PUSHJ P,GNAME
	OPEN 11,[14↔'DSK   '↔BUF1]
	JRST 4,.
	INBUF 11,NBUFS		;SETUP 1st INPUT BUFFER RING
	LOOKUP 11,FILNAM
	JRST MIXER
	AOJ BC1,		;SET TO 1 FOR SECOND DEFAULT FILE NAME

SECOND:	CLRBFI
	OUTSTR [ASCIZ/	TYPE SECOND NAME : /]
	PUSHJ P,GNAME
	OPEN 2,[14↔'DSK   '↔BUF2]
	JRST 4,.
	INBUF 2,NBUFS		;SETUP 2nd INPUT BUFFER RING
	LOOKUP 2,FILNAM
	JRST SECOND
	AOJ BC1,		;SET TO 2 FOR OUTPUT DEFAULT FILE NAME

	CLRBFI
	OUTSTR [ASCIZ/	NUMBER OF CHANNELS (DEFAULT=1) -- /]
	INCHWL A
	PUSHJ P,INNUM
	SKIPLE
	CAILE 4
	HRRZI 1
	HRRZM NCHNLS

	CLRBFI
	OUTSTR [ASCIZ/	SRATE (DEFAULT=12800) -- /]
	INCHWL A
	PUSHJ P,INNUM
	SKIPN
	HRRZI =12800		;SRATE DEFAULT
	FLTR 0,0
	MOVEM FSRATE#		;FLOATING SRATE
	PUSHJ P,GDLAY
	MOVEM SNUM2#		;SECOND FILE DELAY

GBITS:	CLRBFI
	OUTSTR [ASCIZ/	NUMBER OF BITS PER SAMPLE? (DEFAULT=12) -- /]
	INCHWL A
	PUSHJ P,INNUM
	CAIE =18
	JRST CK12
	MOVE [-1,,0]		;MUNG CODE FOR 18 BITS
	MOVEM NEG
	HRRZI 400000
	HRRM N1
	HRRM N2
	HRRM N3
	HRRZI -11
	HRRM A1
	HRRM A2
	HRRZI 2			;SETUP 18 BIT FLAG
	JRST GOTB

CK12:	CAIE =12
	JUMPN GBITS
	MOVE [777777774000]	;MUNG CODE FOR 12 BITS
	MOVEM NEG
	HRRZI 774000
	HRRM N1
	HRRM N2
	HRRM N3
	HRRZI -14
	HRRM A1
	HRRM A2
	SETZ			;SETUP 12 BIT FLAG
GOTB:	HRRZM NBITS		;NBITS = 0 IF 12 BITS, =2 IF 18 BITS
	
GRAT:	CLRBFI
	OUTSTR [ASCIZ/
  DEFAULT AMPL. FACTOR RATIO = .5:.5
  TYPE SPLICE OR RATIO (S OR <R1>:<R2>) -- /]
	INCHWL A
	CAIE A,"s"
	CAIN A,"S"
	JRST SPLICE
	SETZM SFLG#		;SPLICE FLAG
	PUSHJ P,GETNUM
	SKIPG R1,
	MOVE R1,[DOT5:	=0.5]
	SKIPN NBITS
	FMPR R1,[=4096.]	;SHIFT TO MIDDLE OF WORD
	SKIPE NBITS
	FMPR R1,[=512.]
	KIFIX R1,R1
	INCHRS A
	JRST .+3		;NO DOT
	PUSHJ P,GETNUM
	SKIPG R2,
	MOVE R2,DOT5
	SKIPN NBITS
	FMPR R2,[=4096.]	;SHIFT TO MIDDLE OF WORD
	SKIPE NBITS
	FMPR R2,[=512.]
	KIFIX R2,R2
	PUSHJ P,ONAME		;GET OUTPUT FILE NAME
	AOJ BC2,		;??
	SETZ MAX,		;START AT 0 MAX AMP
	SETOM DFLG#		;SET DELAY FLAG

DLAY:	ADD DUR,BC1		;ADD 1st BUFFER TO DURAITOM
	CAML DUR,SNUM2		;CHECK IF PAST 2nd START TIME
	JRST FIND
	PUSHJ P,MOV		;COPY 1st FILE TO OUTPUT
	PUSHJ P,IN1		;GET MORE INPUT
	JRST DLAY

;			COPIER SUB
MOV:	ILDB D,A		;GET INPUT SAMPLE
N1:	TRNE D,774000		;CHECK IF NEGATIVE
	TDO D,[NEG: 777777774000]	;MAKE NEGATIVE
	IMUL D,R1		;MULTIPLY BY FIRST RATIO
A1:	ASH D,-14		;SHIFT END OF WORD (NO FRACTION)
	CAMLE D,MAX		;CHECK IF > MAX AMP
	MOVE MAX,D		;NEW MAX
	IDPB D,C		;STORE IN OUT BUF
	SOJLE BC3,MOVO		;CHECK FOR FULL OUT BUF
	SOJG BC1,MOV		;MORE COPY?
	POPJ P,

MOVO:	PUSHJ P,OBUF		;GET NEW OUT BUF
	SOJG BC1,MOV		;MORE COPY?
	POPJ P,

;			END OF FIRST DELAY
FIND:	SUB DUR,SNUM2		;GET COUNT OF FIRST MIX BUFFER
	SOJ BC2,		;??

	SUB BC1,DUR		;GET COPY COUNT
	SKIPLE BC1
	PUSHJ P,MOV		;COPY END OF DELAY
SETFLG:	SETZM DFLG		;NO MORE DELAY
	SKIPG BC1,DUR		;GET REST OF 1st BUF COUNT
	PUSHJ P,IN1		;GET NEW INBUF IF EMPTY
	MOVE DUR,SNUM2		;DURATION ← DELAY TIME
	ADD DUR,BC2		;DUR ← DUR + OUT BUF COUNT
	
MIX:	ILDB D,A		;GET 1st SAMPLE
N2:	TRNE D,774000		;FIX FOR NEGATIVE
	TDO D,NEG
	ILDB E,B		;GET 2nd SAMPLE
N3:	TRNE E,774000		;FIX FOR NEGATIVE
	TDO E,NEG
	IMUL D,R1		;* 1st RATIO
	IMUL E,R2		;* 2nd RATIO
	ADD D,E			;MIX TWO SAMPLES
A2:	ASH D,-14		;GET RID OF FRACTION
	CAMLE D,MAX
	MOVE MAX,D		;UPDATE MAX AMP
	IDPB D,C		;STORE IN OUT BUF
	SOJLE BC3,MIXO		;CHECK FOR FULL OUT BUF
CKIN:	SOJLE BC1,MIXI		;CHECK FOR 1st IN BUF FULL
	SOJG BC2,MIX		;CHECK FOR 2nd IN BUF FULL
	PUSHJ P,IN2		;GET NEW IN BUF #2
	ADD DUR,BC2		;UPDATE DURATION
	JRST MIX

MIXO:	PUSHJ P,OBUF		;GET NEW OUT BUF
	JRST CKIN
MIXI:	PUSHJ P,IN1		;GET NEW IN BUF #1
	JRST CKIN+1

SPLICE:	SETOM SFLG#		;SET SPLICE FLAG
	PUSHJ P,ONAME		;GET OUTPUT FILE NAME
SLOOP:	ADD DUR,BC3		;ADD OUT COUNT TO DURATION
	CAML DUR,SNUM2		;CHECK IF PAST SECOND START TIME
	JRST NXPART
	PUSHJ P,SPLOP		;COPY IT
	PUSHJ P,OBUF		;OUTPUT IT
	PUSHJ P,IN1		;GET MORE INPUT
	JRST SLOOP

;		SPLICE COPIER SUB
SPLOP:	ILDB D,A		;GET SAMPLE FROM IN BUF
	IDPB D,C		;STORE SAMPLE IN OUT BUF
	SOJG BC3,SPLOP		;CHECK IF OUT BUF FULL
	POPJ P,

;		SECOND FILE START
NXPART:	SUB DUR,SNUM2
	SUB BC3,DUR		;GET NUMBER OF SAMPLES LEFT IN 1st FILE
	SKIPLE BC1,BC3		;SET UP 1st BYTE COUNT WITH NUMBER LEFT IN OUTBUF
	PUSHJ P,SPLOP		;COPY LAST SAMPLES OF 1st FILE IF ANY

FINSH:	MOVE A,B		;SETUP 1st POINTER TO POINT TO 2nd INBUF
	SKIPLE BC3,DUR		;OUTBUF COUNT ← NUMBER LEFT IN OUTBUF
	PUSHJ P,SPLOP		;FILL REST OF OUTBUF WITH 2nd INBUF, IF ANY
	PUSHJ P,OBUF 		;OUTPUT IT
	EXCH DUR,SNUM2		;DURATION ← DELAY TIME, SAVE COUNT BETWEEN IN & OUT

FIL2:	ADD DUR,BC2		;ADD 2nd INBUF COUNT TO DURATION
	SKIPLE BC3,BC1		;OUTBUF COUNT ← NUMBER LEFT IN OUTBUF
	PUSHJ P,SPLOP		;COPY IT
	PUSHJ P,IN2		;GET MORE OF 2nd FILE
	MOVE A,B		;POINT TO 2nd INBUF
	SKIPLE BC3,SNUM2	;SETUP IN TO OUT COUNT
	PUSHJ P,SPLOP		;COPY IT
	PUSHJ P,OBUF		;OUTPUT IT
	JRST FIL2

;		1st FILE INPUT SUB
IN1:	IN 11,
	CAIA
	JRST CKEOF
	SKIPN BC1,NBITS
	HRRZI BC1,3
	IMUL BC1,BUF1+2		;MULTIPLY WORD COUNT BY NUM OF SAMPLES IN A WORD
	HRRZ A,BUF1+1		;POINT TO 1st INBUF
	HRLI A,1400		;NUMBER OF BITS IN SAMPLE
	SKIPE NBITS
	HRLI A,2200
	POPJ P,

CKEOF:	STATO 11,20000		;CHECK FOR ERROR
	JRST 4,.
	SETOM EOF1		;SET END OF FILE #1
	SKIPGE EOF2		;CHECK IF SECOND FILE DONE
	JRST DONE
	SKIPL SFLG
	SKIPGE DFLG
	JRST BREAK		;FILL WITH ZEROS IF SPLICE OR DELAY
PART2:	MOVE R1,R2		;RATIO #1 ← RATIO #2
	SOJLE BC2,GMOR		;CHECK FOR MORE 2nd INPUT
	MOVE BC1,BC2		;SAMPLE COUNT #1 ← SAMPLE COUNT #2
	MOVE A,B		;POINT TO INBUF #2
	PUSHJ P,MOV		;COPY IT
GMOR:	PUSHJ P,IN2		;GET MORE INPUT
	ADD DUR,BC2		;UPDATE DURATION
	JRST PART2+2

BREAK:	SUB DUR,SNUM2		;DUR ← NEGATIVE NUMBER OF SAMPLES TO ZERO
	SKIPGE SFLG
	JRST ZSPL		;JUMP IF SPLICE
	SETZ D,
ZRIT:	IDPB D,C		;ZERO SAMPLE IN OUTBUF
	SOJLE BC3,ZOB		;CHECK IF OUTBUF FULL
	AOJL DUR,ZRIT		;ZERO REST OF DELAY BETWEEN FILES
	MOVE DUR,SNUM2		;DURATION ← DELAY TIME
	JRST PART2

ZOB:	PUSHJ P,OBUF		;GET NEW OUTBUF
	JRST ZRIT+2

ZSLOP:	ADD DUR,BC3
	JUMPG DUR,ZEND		;ALMOST DONE IF OUTBUF COUNT + DURATION > DELAY
	HRLI C,-200
	SETZM 1(C)		;ZERO OUTBUF
	AOBJN C,.-1
	PUSHJ P,OBUF		;OUTPUT IT
ZSPL:	JUMPL DUR,ZSLOP		;JUMP IF MORE THAN ONE OUTBUF
	HRRZI BC1,600		;??
	SKIPE NBITS
	HRRZI BC1,400
	JRST EQEND

ZEND:	MOVE DUR
	SUB BC3
	MOVN BC1,		;BYTE COUNT #1 ← NUM OF SAMPLES LEFT IN OUTBUF
	SETZ
	IDPB C			;ZERO IT
	AOJL .-1
EQEND:	MOVE A,B		;POINT TO INBUF #2
	POP P,D			;GET RID OF RETURN ADDRESS
	JRST FIL2-1		;??

;		2nd FILE INPUT SUB
IN2:	IN 2,
	CAIA
	JRST CKEOF2
	SKIPN BC2,NBITS
	HRRZI BC2,3
	IMUL BC2,BUF2+2		;MULTIPLY WORD COUNT BY NUM OF SAMPLES IN A WORD
	HRRZ B,BUF2+1		;POINT TO 1st INBUF
	HRLI B,1400		;NUMBER OF BITS IN SAMPLE
	SKIPE NBITS
	HRLI B,2200
	POPJ P,

CKEOF2:	STATO 2,20000		;CHECK FOR ERROR
	JRST 4,.
	SETOM EOF2		;SET END OF FILE FLAG #2
	SKIPL SFLG
	SKIPGE EOF1
	JRST DONE		;DONE IF SPLICE OR FILE #1 DONE
	ADD DUR,BC1		;UPDATE DURATION
	PUSHJ P,MOV		;COPT IT
	PUSHJ P,IN1		;GET MORE INPUT FROM FILE #1
	JRST .-3		;DO INTIL DONE

;		OUTPUT FILE SUB
OBUF:	HRRM C,BUF3+1		;POINT TO LAST OUTBUF WORD
	OUT
	CAIA
	JRST 4,.
	SKIPN BC3,NBITS
	HRRZI BC3,3
	IMUL BC3,BUF3+2		;BC3 ← NUM OF WORDS IN OUTBUF * NUM OF SAMPLES IN A WORD
	HRRZ C,BUF3+1		;POINT TO OUTBUF
	HRLI C,1400		;NUMBER OF BITS IN SAMPLE
	SKIPE NBITS
	HRLI C,2200
	POPJ P,

;		OUTPUT FILE NAME SUB
ONAME:	CLRBFI
	OUTSTR [ASCIZ/
	TYPE OUTPUT NAME (DEFAULT=MIX.SND) -- /]
	HRRZI BC1,2		;BC1←2 FOR DEFAULT FILE NAME
	PUSHJ P,GNAME
	OPEN [14↔'DSK   '↔BUF3,,0]
	JRST 4,.
	OUTBUF NBUFS		;SETUP OUTPUT BUFFER RING
	ENTER FILNAM
	JRST ONAME
	SETZ DUR,		;DURATION ← 0
	MOVE MODNAM
	CAME MIXMO		;CK FOR LINK
	POPJ P,
	PUSHJ P,OBUF+1		;+1 → NO OUTPUT YET
	SETZM EOF1#		;INIT END OF FILE #1 FLAG
	SETZM EOF2#		;INIT END OF FILE #2 FLAG
	PUSHJ P,IN1		;GET A BUFFER FROM 1st FILE
	PUSHJ P,IN2		;GET A BUFFER FROM 2nd FILE
	POPJ P,

GDLAY:	CLRBFI
	OUTSTR [ASCIZ/	DELAY TIME = /]
	INCHWL A
	PUSHJ P,GETNUM
	HRRZ A,NCHNLS
	FLTR A,A
	FMPR A
	FMPR FSRATE
	KIFIX 0,0
	POPJ P,			;RETURNS WITH NUM OF CHANS * SRATE * DELAY IN AC0

DONE:	PUSHJ P,OBUF		;OUTPUT LAST STUFF
	RELEAS			;FINISH AND RELEASE DISK
	SKIPGE SFLG
	JRST NOMAX		;NO TYPEOUT OF MAX AMP IF SPLICE
	OUTSTR [ASCIZ/
	MAX AMPL = /]
	MOVE MAX
	PUSHJ P,OUTINT		;TYPEOUT MAX AMP
NOMAX:	OUTSTR [ASCIZ/
	NUMBER OF SAMPLES = /]
	MOVE DUR
	PUSHJ P,OUTINT		;TYPEOUT NUMBER OF SAMPLES
	OUTSTR [ASCIZ/
	TOTAL DUR = /]
	IDIV DUR,NCHNLS
	FLTR DUR,DUR
	FDVR DUR,FSRATE
	KIFIX 0,DUR
	PUSHJ P,OUTINT		;TYPEOUT DURATION / NUM OF CHANS / SRATE
	HRRZI "."
	OUTCHR
	MOVE DUR
	KIFIX DUR,DUR
	FLTR DUR,DUR
	FSBR DUR
	FMPR [=10000.]
	KIFIX 0,0
	AOJ
	IDIVI =10
	PUSHJ P,OUTINT		;TYPEOUT REMAINDER
	EXIT

;		DEFAULT FILE NAMES
NAME:	'TEST  '		;1st INPUT	NAME
	'TEST  '		;2nd INPUT
	'MIX   '		;OUTPUT
EXT:	'SND   '		;1st INPUT	EXTENTION
	'SND   '		;2nd INPUT
	'SND   '		;OUTPUT
;		FILE NAME PARSER
GNAME:	SETZM NONAME
	SETZM FILEXT+1
	SETZM FILPPN
	MOVE A,EXT(BC1)
	MOVEM A,FILEXT
	PUSHJ P,GETNAM
	JUMPN A,GEXT
 	MOVE A,NAME(BC1)
	SETOM NONAME
GEXT:	MOVEM A,FILNAM
	CAIE C,"."
	JRST NOEXTN
	PUSHJ P,GETNAM
	MOVEM A,FILEXT
NOEXTN:	CAIE C,"["
	JRST FFDX
	PUSHJ P,GETP
	HRLZM A,FILPPN
	PUSHJ P,GETP
	HRRM A,FILPPN
FFDX:	INCHRW C
	CAIE C,12
	JRST FFDX
	POPJ P,

GETNAM:	MOVEI A,
	MOVE B,[440600,,A]
GETNML:	PUSHJ P,RCH
	POPJ P,
	SUBI C,40
	TLNE B,770000
	IDPB C,B
	JRST GETNML

GETP:	MOVEI A,
GETPL:	PUSHJ P,RCH
	POPJ P,
	TRNE A,770000
	JRST GETPL
	LSH A,6
	ADDI A,-40(C)
	JRST GETPL

RCH:	INCHWL C
	CAIN C,42
	JRST RCHQ
	CAIE C,11
	CAIN C," "
	JRST RCH
	CAIE C,"."
	CAIN C,","
	POPJ P,
	CAIE C,"["
	CAIN C,"]"
	POPJ P,
RCHQR:	CAIGE C,40
	POPJ P,
	CAIL C,"a"
	CAILE C,"z"
	CAIA
	SUBI C,40
POPJ1:	AOS (P)
	POPJ P,

RCHQ:	INCHWL C
	JRST RCHQR

;		FLOATING POINT INPUT
GETNUM:	PUSHJ P,INNUM
	FLTR 0,0
	CAIE A,"."
	POPJ P,
	MOVE C,
	INCHRS A
	POPJ P,
	PUSHJ P,INNUM
	JUMPE NODP
	FLTR 0,0
	FMPR TABL(B)
NODP:	FADR C
	POPJ P,

TABL:	=0.1
	=0.01
	=0.001
	=0.0001
	=0.00001

;		INTEGER INPUT
INNUM:	SETZ
	SETO B,
	CAIL A,60
	CAILE A,71
	POPJ P,
	IMULI =10
	ADDI -60(A)
	AOJ B,
	INCHRS A
	POPJ P,
	JRST INNUM+2

;		INTEGER TYPEOUT
OUTINT:	HRRZI B,7
	JUMPE OUTZ
	IDIVI =10
	ADDI A,60
	HRRZM A,BLK(B)
	SOJGE B,OUTINT+1
OCHR:	OUTCHR BLK+1(B)
	CAIGE B,6
	AOJA B,OCHR
	POPJ P,
OUTZ:	CAIL B,7
	HRLZI B,300000
	JRST OCHR

FILNAM:	0
FILEXT:	0
	0
FILPPN:	0
BUF1:	BLOCK 3
BUF2:	BLOCK 3
BUF3:	BLOCK 3
PDL:	BLOCK 44
ACBLK:	BLOCK 20
BLK:	BLOCK 10
	END BEG